home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / wb / md1_8.lha / MultiDisplay / SrC / mdprincipal.c < prev    next >
C/C++ Source or Header  |  1997-09-06  |  9KB  |  320 lines

  1. /*
  2. **
  3. ** MULTI DISPLAY
  4. ** " Le vrai-faux viewer universel "
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #include <exec/types.h>
  11. #include <exec/memory.h>        /* AllocVec() */
  12. #include <exec/libraries.h>     /* struct Library */
  13. #include <dos/dos.h>            /* BPTR */
  14. #include <dos/dosasl.h>         /* struct AnchorPath */
  15. #include <dos/rdargs.h>         /* Pour ReadArgs() */
  16. #include <workbench/workbench.h>
  17. #include <workbench/startup.h>  /* struct WBStartup */
  18.  
  19. #include <pragmas/dos_pragmas.h>
  20. #include <pragmas/exec_pragmas.h>
  21.  
  22. #include "md_strings.h"
  23.  
  24. #define TEMPLATE          "All/S,Sync/S,ShowDT/S,Files/A/M"
  25. #define OPT_ALL           0
  26. #define OPT_SYNC          1
  27. #define OPT_SHOW          2
  28. #define OPT_FILES         3
  29. #define OPT_COUNT         4
  30.  
  31. /* Prototypes des fonctions */
  32. extern BOOL OuvrirLibrairies(void);
  33. extern void FermerLibrairies(void);
  34. extern BOOL LectureIcone(STRPTR icon_name,BPTR icon_dir,BOOL keep_icon);
  35. extern BOOL Recherche(STRPTR arg);
  36. extern BOOL VerificationSys(void);
  37. extern BOOL RTRequete(void);
  38. extern BOOL RTInfo(STRPTR body);
  39. extern BOOL CreerIcone(void);
  40. extern STRPTR GetString(struct LocaleInfo *li, LONG stringNum);
  41.  
  42. struct AnchorPath ap;                           /* Alignement en LONGWORD */
  43. extern struct Library *SysBase,*DOSBase;        /* Deja ouvertes */
  44.  
  45. extern struct LocaleInfo md_locale;             /* Pour GetString() */
  46. extern BPTR in_dir;
  47. STRPTR VERSION = "$VER: Multidisplay 1.8 (6.9.97)\n\0";
  48. LONG opts[OPT_COUNT];                           /* Parametres */
  49. BPTR source=NULL;                               /* Fichier de config */
  50. LONG position;                                  /* Position initiale dans ce fichier */
  51. STRPTR def;                                     /* Instruction par defaut */
  52. BOOL app=FALSE,all=FALSE,sync=FALSE,show=FALSE; /* Parametres */
  53.  
  54. /* Determine les fichiers qui sont à traiter dans le cas de joker
  55.    Sinon ne fait qu'appeller Recherche() */
  56. BOOL TraitementCli(STRPTR arg)
  57. {
  58.    BPTR old_dir;
  59.    BOOL changer_rep=FALSE;
  60.    ULONG result;
  61.    STRPTR pbuffer,buffer;
  62.  
  63.    pbuffer = (STRPTR)AllocVec(3*strlen(arg),MEMF_PUBLIC|MEMF_CLEAR);
  64.    if( !pbuffer )
  65.       return FALSE;
  66.  
  67. #ifdef DEBUG
  68.    printf("Traitement de %s\n",arg);
  69. #endif
  70.  
  71.    /* Teste si l'argument contient un joker */
  72.    result = ParsePattern(arg,pbuffer, 3*strlen(arg) );
  73.    if( result == 1)
  74.    {
  75. #ifdef DEBUG
  76.       printf("Joker utilisé dans %s\n",arg);
  77. #endif
  78.       /* Initialisation de la structure AnchorPath */
  79.       ap.ap_BreakBits = SIGBREAKF_CTRL_C;
  80.       ap.ap_Strlen = 0;
  81.       /* Recherche le s'il existe au moins un objet DOS correspondant */
  82.       result = MatchFirst(arg,&ap);
  83.       if( result == 0 )
  84.       {
  85.          /* Oui */
  86.          changer_rep = TRUE;
  87.       }
  88.       else
  89.       {
  90.          /* Non */
  91.          FreeVec(pbuffer);
  92.          buffer = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  93.          if( !pbuffer )
  94.             return FALSE;
  95.          sprintf(buffer,GetString(&md_locale,MSG_NOMATCH),arg);
  96.          RTInfo(buffer);
  97.          MatchEnd(&ap);
  98.          FreeVec(buffer);
  99.          return FALSE;
  100.       }
  101.    }
  102.  
  103.    if( changer_rep == TRUE )
  104.    {
  105.       do
  106.       {
  107.          old_dir = CurrentDir(ap.ap_Current->an_Lock);
  108.          strcpy(pbuffer,ap.ap_Info.fib_FileName);
  109.          if( ap.ap_Info.fib_DirEntryType > 0 )
  110.          {
  111. #ifdef DEBUG
  112.             printf("Répértoire : %s\n",pbuffer);
  113. #endif
  114.             if( all == TRUE )
  115.             {
  116.                /* On autorise l'entree dans ce repertoire si on n'en vient pas ! */
  117.                if( ! (ap.ap_Flags & APF_DIDDIR) )
  118.                   ap.ap_Flags = ap.ap_Flags | APF_DODIR;
  119.                /* On nettoie pour pouvoir entrer dans d'autres repertoires */
  120.                ap.ap_Flags = ap.ap_Flags & ~APF_DIDDIR;
  121.             }
  122.          }
  123.          else
  124.          {
  125. #ifdef DEBUG
  126.             printf("Occurence : %s\n",pbuffer);
  127. #endif
  128.             Recherche(pbuffer);
  129.          }
  130.          CurrentDir(old_dir);
  131.       }while( MatchNext(&ap) == 0 );
  132.    }
  133.    else Recherche(arg);
  134.  
  135.    MatchEnd(&ap);
  136.    FreeVec(pbuffer);
  137.  
  138.    return TRUE;
  139. }
  140.  
  141. /* Decortique la liste des arguments et appelle Recherche() s'il y a des arguments
  142.    Si l'argument/tooltype AppIcon existe on cree une AppIcon qu'il y ait des arguments ou non
  143.    Si une erreur se produit, on renvoie FALSE pour ouvrir la requete de fichiers */
  144. BOOL TraitementWB(char **args)
  145. {
  146.    struct WBStartup *wbs;
  147.    struct WBArg *wbarg;
  148.    BPTR old_dir;
  149.    LONG nbr,i;
  150.  
  151.    wbs = (struct WBStartup *)args;
  152.    wbarg = wbs->sm_ArgList;
  153.    nbr = wbs->sm_NumArgs;
  154.  
  155.    /* On en profite pour recuperer la structure DiskObject qui correspond au tooltype APPICON */
  156.    LectureIcone(wbarg->wa_Name,wbarg->wa_Lock,TRUE);
  157.  
  158.    /* Pas d'arguments, juste le nom de MD (0 impossible, non ?) */
  159.    if( nbr <= 1 )
  160.       return FALSE;
  161.    /* Sinon on a des arguments : on les traite */
  162.    wbarg++;
  163.  
  164.    for(i=1;i<nbr;i++,wbarg++)
  165.    {
  166.       /* Quel genre d'objet ne peut pas avoir de lock */
  167.       if( wbarg->wa_Lock )
  168.       {
  169. #ifdef DEBUG
  170.          printf("Traitement de %ld : %s (lock)\n",i,wbarg->wa_Name);
  171. #endif
  172.          old_dir = CurrentDir(wbarg->wa_Lock);
  173.       }
  174. #ifdef DEBUG
  175.       else
  176.          printf("Traitement de %ld : %s\n",i,wbarg->wa_Name);
  177. #endif
  178.       /* Ici on ne peut pas avoir de joker */
  179.       Recherche(wbarg->wa_Name);
  180.       if( old_dir )
  181.          CurrentDir(old_dir);
  182.    }
  183.  
  184.    return TRUE;
  185. }
  186.  
  187. /* Ferme "tout" en cas de break inopine */
  188. void Break(void)
  189. {
  190.    if( source ) Close(source);
  191.    if( in_dir ) UnLock(in_dir);
  192. }
  193.  
  194. /* Ouvre les librairies et le fichier de configuration
  195.    Determine le mode de lancement puis les options eventuelles
  196.    Appelle TraitementCli(), TraitementWB() ou RTRequete() selon le cas */
  197. int main(int argn,char **argv)
  198. {
  199.    struct RDArgs *argsptr;
  200.    BOOL ask_user=FALSE;
  201.    STRPTR buffer,*sptr;
  202.  
  203.    if( VerificationSys() == FALSE )
  204.    {
  205.       printf(GetString(&md_locale,MSG_KSVERSION));
  206.       return RETURN_ERROR;
  207.    }
  208.    atexit(Break);
  209.  
  210.    def = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  211.    buffer = (STRPTR)AllocVec(MAX_BUFFER,MEMF_PUBLIC|MEMF_CLEAR);
  212.    if( (!buffer) || (!def) )
  213.       return RETURN_ERROR;
  214.  
  215.    /* Ouverture des librairies necessaires */
  216.    if( OuvrirLibrairies() == FALSE )
  217.    {
  218.       printf(GetString(&md_locale,MSG_NOLIBS));
  219.       FermerLibrairies();
  220.       FreeVec(buffer);
  221.       FreeVec(def);
  222.       return RETURN_ERROR;
  223.    }
  224.  
  225.    /* Ouverture du fichier de configuration */
  226.    source = Open("S:MD.config",MODE_OLDFILE);
  227.    if( !source )
  228.    {
  229.       Fault(IoErr(),"S:MD.config",buffer,MAX_BUFFER);
  230.       RTInfo(buffer);
  231.       FermerLibrairies();
  232.       FreeVec(buffer);
  233.       FreeVec(def);
  234.       return RETURN_ERROR;
  235.    }
  236.  
  237.    /* Lecture de l'instruction par defaut */
  238.    FGets(source,def,MAX_BUFFER);
  239. #ifdef DEBUG
  240.    printf("Instruction par défaut : %s",def);
  241. #endif
  242.    /* Sauvegarde de l'emplacement actuel dans le fichier */
  243.    position = Seek(source,0,OFFSET_CURRENT);
  244.  
  245.    /* Teste si MD est lance depuis un Shell car ReadArgs() a besoin d'une entree
  246.       depuis laquelle il lit les parametres
  247.       Dans le cas d'un lancement depuis le WB on aurait alors ouverture d'une fenetre
  248.       Un equivalent serait de tester le retour de Cli() */
  249.    if( argn != 0 )
  250.    {
  251.       /* "Tache CLI" : lecture parametres */
  252.       argsptr = (struct RDArgs *)ReadArgs(TEMPLATE,opts,NULL);
  253.       if( argsptr != NULL )
  254.       {
  255.          if( opts[OPT_ALL] )
  256.          {
  257. #ifdef DEBUG
  258.             printf("Option All activée...\n");
  259. #endif
  260.             all = TRUE;
  261.          }
  262.          if( opts[OPT_SYNC] )
  263.          {
  264. #ifdef DEBUG
  265.             printf("Option Sync activée...\n");
  266. #endif
  267.             sync = TRUE;
  268.          }
  269.          if( opts[OPT_SHOW] )
  270.          {
  271. #ifdef DEBUG
  272.             printf("Option ShowDT (et donc Sync) activée...\n");
  273. #endif
  274.             show = TRUE;
  275.             sync = TRUE;
  276.          }
  277.          sptr = (STRPTR *)(opts[OPT_FILES]);
  278.          if( sptr )
  279.          {
  280.             /* Traitement de tous les arguments */
  281.             while( *sptr )
  282.             {
  283.                TraitementCli(*sptr);
  284.                sptr++;
  285.             }
  286.          }
  287.       }
  288.       else ask_user = TRUE;     /* Pas de parametres */
  289.       /* Liberation seulement si argsptr utilise ! */
  290.       FreeArgs(argsptr);
  291.    }
  292.    else
  293.    {
  294.       /* "Tache WB" : argn vaut 0 mais argv peut pointer sur une structure WBStartup
  295.          s'il y a des arguments. Normalement il y en a au moins un, qui est le
  296.          nom de MD, donc la condition devrait etre toujours verifiee !?
  297.          Avec DICE, le point d'entrée serait wbmain() et non main() */
  298.       if( argv )
  299.       {
  300.          if( TraitementWB(argv) == FALSE )
  301.             ask_user = TRUE;
  302.       }
  303.       else ask_user = TRUE;
  304.    }
  305.  
  306.    /* On regarde s'il faut iconifier */
  307.    if( app == TRUE )
  308.        CreerIcone();
  309.    /* Afficher la requete de fichiers ? */
  310.    else if( ask_user == TRUE )
  311.       while( RTRequete() == TRUE );
  312.  
  313.    FreeVec(def);
  314.    FreeVec(buffer);
  315.    FermerLibrairies();
  316.    Close(source);
  317.    source = NULL;
  318.    return RETURN_OK;
  319. }
  320.